package com.xudu.tourbackend.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xudu.tourbackend.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xudu.tourbackend.entity.request.SearchUserRequest;
import com.xudu.tourbackend.entity.request.UpdateUserRequest;
import com.xudu.tourbackend.entity.vo.UserVo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author xudu
 * @since 2024-06-17
 */
public interface IUserService extends IService<User> {

    /**
     * 用户使用账号密码注册
     * @param userAccount 用户账号
     * @param userPassword 用户密码
     * @param checkUserPassword 确认密码
     * @return 注册成功用户id
     */
    int register(String userAccount, String userPassword, String checkUserPassword) throws Exception;

    /**
     * 用户使用手机号 + 短信验证码注册
     * @param userPhone 手机号
     * @return 验证码
     */
    String registerByPhone(String userPhone);

    /**
     * 确认验证码并注册用户
     * @param userPhone 手机号
     * @param code 验证码
     * @return 注册成功用户id
     */
    int verifyCode(String userPhone, String code);

    /**
     * 用户使用账号密码登录
     * @param account 账号
     * @param userPassword 密码
     * @param request 请求
     * @return 登录成功用户信息
     */
    UserVo login(String account, String userPassword, HttpServletRequest request) throws Exception;

    /**
     * 用户使用手机号 + 短信验证码登录
     * @param userPhone 手机号
     * @return 验证码
     */
    String loginByPhone(String userPhone);

    /**
     * 确认验证码并登录用户
     * @param userPhone 手机号
     * @param code 验证码
     * @param request 请求
     * @return 登录成功用户信息
     */
    UserVo loginVerifyCode(String userPhone, String code, HttpServletRequest request);

    /**
     * 获取登录用户
     * @param request 请求
     * @return 登录用户信息
     */
    UserVo getLoginUser(HttpServletRequest request);

    /**
     * 判断是否为管理员
     * @param loginUser 登录用户信息
     * @return 是否为管理员true/false
     */
    Boolean isAdmin(UserVo loginUser);

    /**
     * 判断是否为管理员
     * @param request 请求
     * @return 是否为管理员true/false
     */
    Boolean isAdmin(HttpServletRequest request);

    /**
     * 用户退出登录
     * @param request 请求
     */
    void userLogout(HttpServletRequest request);


    /**
     * 根据用户名查询用户
     * @param searchUserRequest 用户查询请求体
     * @param request 请求
     * @return 用户信息列表
     */
    IPage<UserVo> searchUser(SearchUserRequest searchUserRequest, HttpServletRequest request);

    /**
     * 更新用户信息
     *
     * @param updateUserRequest 更新用户信息请求体
     * @param request           请求
     * @return 更新后的用户信息
     */
    Boolean updateUser(UpdateUserRequest updateUserRequest, HttpServletRequest request) throws Exception;

    /**
     * 删除用户
     * @param ids 删除用户id列表
     * @param request 请求
     * @return 删除成功的数量
     */
    int deleteUser(List<Integer> ids, HttpServletRequest request);
}
